/*
 * Copyright (c) 2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef OLA_FRAMEWORK_H
#define OLA_FRAMEWORK_H

#include <stdbool.h>
#include <stddef.h>
#include "ola_sdk_api.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef enum {
    OLA_HANDLE_STATE_OK = 0,
    OLA_HANDLE_STATE_ERROR,
} OlaHandleState;

typedef void (*OlaFrameworkHandleCallback)(OlaHandleState state);

/*
 * 功能: 主流程框架业务函数
 * 返回: OLA_OK，业务处理成功
 *       其他，业务处理失败，主流程框架会重置
 */
typedef int (*OlaFrameworkBusinessProcessFunc)(void);

/*
 * 功能: 主流程框架业务停止函数
 * 注意: 仅做通知，勿阻塞
 */
typedef void (*OlaFrameworkBusinessStopFunc)(void);

typedef enum {
    OLA_FRAMEWORK_STATE_NOT_RUNING = 0,
    OLA_FRAMEWORK_STATE_INIT,
    OLA_FRAMEWORK_STATE_NETCFG,
    OLA_FRAMEWORK_STATE_CONNECT_WIFI,
    OLA_FRAMEWORK_STATE_CONNECT_CLOUD,
    OLA_FRAMEWORK_STATE_M2M_RUNING,
} OlaFrameworkState;

typedef struct {
    OlaFrameworkBusinessProcessFunc process;
    OlaFrameworkBusinessStopFunc stop;
} OlaFrameworkBusiness;

typedef struct {
    /* 配网业务 */
    OlaFrameworkBusiness provisioning;
    /* 网络连接业务 */
    OlaFrameworkBusiness connectWifi;
    /* 端云连接业务 */
    OlaFrameworkBusiness connectCloud;
    /* 稳定运行业务 */
    OlaFrameworkBusiness m2mRuning;
    /* 常驻内存标志 */
    bool resident;
} OlaFrameworkInfo;

/*
 * 功能: 注册框架处理需要的钩子函数，通过实现自定义流程完成业务
 *       调用者需要设置结构体完整的成员变量值
 * 参数: hook，不同业务自定义的结构体指针
 * 返回: OLA_OK，注册成功
 *       其他，注册失败
 */
int OlaFrameworkHookRegister(const OlaFrameworkInfo *hook);

/*
 * 功能: 去注册框架处理钩子函数
 * 注意: 只能在主框架未开始或者已退出的情况下调用
 */
int OlaFrameworkHookUnregister(void);

/* 功能: 主框架实现，拉起各业务 */
void OlaFrameworkMain(void);

/*
 * 功能: 重置主框架运行状态
 * 参数: cb，重置完成后的回调函数
 * 注意: 异步实现
 *       主框架内存常驻标志为true时与OlaFrameworkStop等效
 *       回调函数使用后会自动去注册
 */
void OlaFrameworkReset(OlaFrameworkHandleCallback cb);

/*
 * 功能: 停止主框架
 * 参数: cb，停止完成后的回调函数
 * 注意: 异步实现
 *       回调函数使用后会自动去注册
 */
void OlaFrameworkStop(OlaFrameworkHandleCallback cb);

/*
 * 功能: 获取主框架状态
 * 返回: 主框架状态
 */
OlaFrameworkState GetFrameworkState(void);

#ifdef __cplusplus
}
#endif

#endif /* OLA_FRAMEWORK_H */